﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Input;
using System.Windows.Controls.Ribbon;
using SHomeWorkshop.LunarConcept.Controls;
using System.Xml;
using SHomeWorkshop.LunarConcept.Tools;
using SHomeWorkshop.LunarConcept.ModifingManager;
using System.Windows;

namespace SHomeWorkshop.LunarConcept.Commands
{
    /// <summary>
    /// 创建时间：2012年1月3日
    /// 创建者：  杨震宇
    /// 
    /// 主要用途：编辑文本命令。
    /// </summary>
    public static class EditCommand
    {
        #region 构造方法=====================================================================================================

        /// <summary>
        /// [静态][构造方法]
        /// 
        /// ——此方法会初始化并向WPF系统注册一个RoutedUICommand。
        /// </summary>
        static EditCommand()//类型构造器
        {
            routedUICmd = new RoutedUICommand(
                "EditCommand",
                "EditCommand",
                typeof(EditCommand),//创建RoutedUICommand对象
                null);

            //routedUICmd.InputGestures.Add(new KeyGesture(Key.Enter, ModifierKeys.None, "Enter"));
            //与消息框冲突。改在主窗口的MainScrollViewer_PreviewKeyUp事件中实现。

            cmdBinding.Command = routedUICmd;
            cmdBinding.CanExecute += new CanExecuteRoutedEventHandler(cmdBinding_CanExecute);
            cmdBinding.Executed += new ExecutedRoutedEventHandler(cmdBinding_Executed);
        }

        #endregion

        #region 字段与属性===================================================================================================

        private static CommandBinding cmdBinding = new CommandBinding();
        /// <summary>
        /// 用在主窗口CommandBindings集合中的命令绑定。
        /// 
        /// 它的Command是RoutedUICommand。
        /// ——因此，RoutedUICommand是否可以运行将由CmdBinding的CanExecute事件决定。
        /// ——而且，RoutedUICommand的执行也是通过CmdBinding的Execute事件来进行的。
        /// </summary>
        public static CommandBinding CmdBinding
        {
            get { return cmdBinding; }
        }

        private static RoutedUICommand routedUICmd;
        /// <summary>
        /// [只读静态属性]表示在WPF系统中注册的一个RoutedUICommand。
        /// ——必须和CommandBinding配合才能使用。
        ///     CommandBinding要添加到主窗口的CommandBindings集合中；
        ///     RoutedUICommand则要向WPF系统注册。
        ///     
        /// ★说明：使用静态属性是因为这样在Xaml代码中比较便于绑定。
        /// </summary>
        public static RoutedUICommand RoutedUICmd
        {
            get { return routedUICmd; }
        }

        #endregion

        #region 方法=========================================================================================================

        /// <summary>
        /// 判断命令是否可以执行。
        /// ——由于可以直接调用Execute()方法，因此，即使被禁用，也不是不能执行相关功能！！！
        /// </summary>
        static void cmdBinding_CanExecute(object sender, CanExecuteRoutedEventArgs e)
        {
            //考虑到性能问题，全部取消此判断。反正执行时会判断。
            //if (Globals.MainWindow == null)
            //{
            //    e.CanExecute = false; return;
            //}

            //EditorManager manager = Globals.MainWindow.EditorManager;
            //if (manager == null)
            //{
            //    e.CanExecute = false; return;
            //}

            //PageEditor pe = manager.GetMainSelectedPageEditor();
            //if (pe == null)
            //{
            //    e.CanExecute = false; return;
            //}

            //List<Widgets.Widget> selectedWidgets = pe.GetSelectedWidgetsList();

            //if (selectedWidgets.Count <= 0)
            //{
            //    e.CanExecute = false; return;
            //}

            e.CanExecute = true; return;
        }

        /// <summary>
        /// 命令被触发时，会调用本事件处理器方法。
        /// ——本方法实际上是调用ExeCute()这个静态方法来实现特定功能。
        /// </summary>
        static void cmdBinding_Executed(object sender, ExecutedRoutedEventArgs e)
        {
            LunarMessage.Warning(Execute());
        }

        /// <summary>
        /// [公开静态方法]即使此命令处于禁用状态，也可以通过代码调用此方法来执行特定任务！！！
        /// 
        /// 当被绑定的命令被调用（触发）时，会引发cmdBinding_Executed事件。
        /// 在cmdBinding_Executed事件处理器方法中已添加了调用Execute()方法的代码。
        /// 
        /// ——因此，触发命令，就相当于调用此方法！！！
        /// </summary>
        public static string Execute()
        {
            if (Globals.MainWindow.IsPresentatingByPath) return string.Empty;   // 演示状态下禁止编辑。

            if (Globals.MainWindow == null || Globals.MainWindow.EditorManager == null)
                return "　　未找到Globals.MainWindow，或未找到页面管理器。";

            EditorManager manager = Globals.MainWindow.EditorManager;
            PageEditor mainPageEditor = manager.GetMainSelectedPageEditor();
            if (mainPageEditor == null) return "　　未找到活动页面。";

            List<Widgets.Widget> selectedWidgets = mainPageEditor.GetSelectedWidgetsList();

            Widgets.Widget mainSelWidget = null;
            foreach (Widgets.Widget w in selectedWidgets)
            {
                if (w.IsMainSelected) { mainSelWidget = w; break; }
            }

            if (selectedWidgets.Count > 0)
            {
                int fishBoneCount = 0;

                foreach (Widgets.Widget w in selectedWidgets)
                {
                    Widgets.PolyLineWidget pw = w as Widgets.PolyLineWidget;
                    if (pw != null &&
                        (pw.LineForm == Enums.PolyLineForms.BigFishBone ||
                        pw.LineForm == Enums.PolyLineForms.MediumFishBone))
                    {
                        fishBoneCount++;
                    }
                }

                if (fishBoneCount == selectedWidgets.Count)
                {
                    return "　　折线作鱼骨线时，不允许编辑文本。";
                }

                if (mainSelWidget == null) mainSelWidget = selectedWidgets[0];

                MainWindow mainWindow = Globals.MainWindow;
                Dialogs.TextAreaEditor tte = new Dialogs.TextAreaEditor(manager, selectedWidgets);

                tte.WindowStartupLocation = WindowStartupLocation.Manual;
                tte.Width = Globals.MainWindow.MainScrollViewer.ActualWidth - 54;
                Point ptBase = new Point(0, 0);
                Point ptStart = Globals.MainWindow.MainScrollViewer.PointToScreen(ptBase);

                double realWidth = (tte.Width > tte.MaxWidth) ? tte.MaxWidth : tte.Width;

                tte.Left = ptStart.X + (Globals.MainWindow.MainScrollViewer.ActualWidth - 20 - realWidth) / 2;
                tte.Height = 100;

                //if (mainSelWidget != null)
                //{
                //    mainWindow.TryToShowWidgetInScrollViewer(mainSelWidget, tte.Height + 40);
                //}

                double scrollBarHeight = mainWindow.MainScrollViewer.ActualHeight - mainWindow.MainScrollViewer.ViewportHeight;

                tte.Top = Globals.MainWindow.MainScrollViewer.ActualHeight + ptStart.Y - 198 - scrollBarHeight;
                tte.Owner = Globals.MainWindow;

                tte.ShowDialog();
            }

            return string.Empty;
        }

        //似乎没有被调用过。
        //internal static string Execute(string initializedText)
        //{
        //    if (Globals.MainWindow == null) return "　　未找到Globals.MainWindow。";
        //    if (Globals.MainWindow.EditorManager == null) return "　　未找到页面管理器。";

        //    EditorManager manager = Globals.MainWindow.EditorManager;
        //    PageEditor mainPageEditor = manager.GetMainSelectedPageEditor();
        //    if (mainPageEditor == null) return "　　未找到活动页面。";

        //    List<Widgets.Widget> selectedWidgets = mainPageEditor.GetSelectedWidgetsList();

        //    Widgets.Widget mainSelWidget = null;
        //    foreach (Widgets.Widget w in selectedWidgets)
        //    {
        //        if (w.IsMainSelected) { mainSelWidget = w; break; }
        //    }

        //    if (selectedWidgets.Count > 0)
        //    {
        //        int fishBoneCount = 0;

        //        foreach (Widgets.Widget w in selectedWidgets)
        //        {
        //            Widgets.PolyLineWidget pw = w as Widgets.PolyLineWidget;
        //            if (pw != null &&
        //                (pw.LineForm == Enums.PolyLineForms.BigFishBone ||
        //                pw.LineForm == Enums.PolyLineForms.MediumFishBone))
        //            {
        //                fishBoneCount++;
        //            }
        //        }

        //        if (fishBoneCount == selectedWidgets.Count)
        //        {
        //            return "　　折线作鱼骨线时，不允许编辑文本。";
        //        }

        //        if (mainSelWidget == null) mainSelWidget = selectedWidgets[0];

        //        MainWindow mainWindow = Globals.MainWindow;
        //        Dialogs.TextAreaEditor tte = new Dialogs.TextAreaEditor(manager, selectedWidgets, initializedText);

        //        tte.WindowStartupLocation = WindowStartupLocation.Manual;
        //        tte.Width = Globals.MainWindow.MainScrollViewer.ActualWidth - 54;
        //        Point ptBase = new Point(0, 0);
        //        Point ptStart = Globals.MainWindow.MainScrollViewer.PointToScreen(ptBase);

        //        double realWidth = (tte.Width > tte.MaxWidth) ? tte.MaxWidth : tte.Width;

        //        tte.Left = ptStart.X + (Globals.MainWindow.MainScrollViewer.ActualWidth - 20 - realWidth) / 2;
        //        tte.Height = 100;

        //        if (mainSelWidget != null)
        //        {
        //            mainWindow.TryToShowWidgetInScrollViewer(mainSelWidget, tte.Height + 40);
        //        }

        //        double scrollBarHeight = mainWindow.MainScrollViewer.ActualHeight - mainWindow.MainScrollViewer.ViewportHeight;

        //        tte.Top = Globals.MainWindow.MainScrollViewer.ActualHeight + ptStart.Y - 198 - scrollBarHeight;
        //        tte.Owner = Globals.MainWindow;

        //        tte.ShowDialog();
        //    }
        //    return string.Empty;
        //}

        #endregion
    }
}
